// import type { VersionPollingOptions } from "../types";

/**
 * 这是一个判断是否有值的函数。
 * @param {any} val - 需要判断的值。
 * @return {boolean} 如果val不为undefined和null，返回true；否则返回false。
 */
export function isDef(val) {
  return val !== undefined && val !== null;
}

/**
 * 创建一个用于Web Worker实例。接收一个函数作为参数，拼接为回调函数的IIFE，然后转成Blob URL，最后用这个URL创建一个Worker实例。
 * @param {Function} func 需要在worker中运行的函数。
 * @return {Worker} 创建创建的Web Worker实例
 */
export const createWorker = (func) => {
  const blob = new Blob(["(" + func.toString() + ")()"], { type: "application/javascript; charset=utf-8" })
  const url = URL.createObjectURL(blob);
  // console.log(url);
  const worker = new Worker(url);
  URL.revokeObjectURL(url);
  return worker;
}

export const createWorkerFunc = () => {
  // 定时器ID，用于控制轮询任务
  let timerId = null;
  // 选项对象：
  /* {
    htmlFileUrl: "string",
    lastEtag: "string",
    appETagKey: "string",
    pollingInterval: "number",
    silentPollingInterval: false,
  } */
  let options = {};
  // self表示本线程范围内的作用域。self.onmessage监听Web Worker发送的消息。
  self.onmessage = (event) => {
    const code = event.data["code"];;
    options = Object.assign({}, options, event.data["data"])

    const { appETagKey, htmlFileUrl, lastEtag, pollingInterval, silentPollingInterval } = options;

    // 发送HEAD请求检查ETag，如果有变化则Web Worker发送通知消息
    const runReq = () => {
      fetch(htmlFileUrl, {
        method: "HEAD",
        cache: "no-cache"
      }).then((response) => {
        if (Number(response.status) !== 200) {
          return;
        }

        const etag = response.headers.get("etag");

        if (lastEtag !== etag) {
          self.postMessage({
            appETagKey,
            lastEtag,
            etag,
          })
        }
      })
    }

    // 启动轮询任务。
    const startPollingTask = () => {
      timerId = setInterval(runReq, pollingInterval);
    }

    // 暂停轮询任务。
    const pausePollingTask = () => {
      if (timerId) {
        clearInterval(timerId);
        timerId = null;
      }
    }

    // 根据code决定是暂停还是继续轮询。如果是“pause”，则暂停轮询；否则，立即执行一次请求并根据选项决定是否开始轮询。
    if (code === "pause") {
      pausePollingTask();
    } else {
      runReq();
      if (!silentPollingInterval) {
        startPollingTask();
      }
    }
  }

  return self;
}

/**
 * 终止指定的Web Worker实例。这个函数接受一个Worker实例作为参数，然后调用terminate方法来终止它。
 * @param {Worker} worker - 需要被关闭的Web Worker实例。
 */
export const closeWorker = (worker) => {
  worker.terminate();
}
